package main

import (
	"fmt"
	"golang-question/config"
	"golang-question/errorx"
	"time"
)

const (
	ErrCodeSecretTooShort = 1001
)

type Secret string

func (s Secret) Validate() errorx.Error {
	if len(s) < 8 {
		return errorx.Cf(ErrCodeSecretTooShort, "invalid secret %s", s)
	}
	return nil
}

type Config struct {
	Secret Secret `yaml:"secret" json:"secret"`
}

func main() {
	// 创建配置管理器并启动监听
	conf := config.Local[Config]().Watch().InitData(Config{
		Secret: "hello world",
	})

	// 注册配置变更回调
	cancel := conf.OnChange(func(cfg Config) {
		fmt.Printf("配置已更新: %+v\n", cfg)
	})
	defer cancel()

	// 验证初始配置
	s := conf.Get().Secret
	if err := s.Validate(); err != nil {
		fmt.Printf("初始配置验证错误: %+v\n", err)
	}

	// 模拟配置更新
	go func() {
		time.Sleep(2 * time.Second)
		if err := conf.Update(Config{Secret: "updated secret"}); err != nil {
			fmt.Printf("更新配置错误: %+v\n", err)
		}

		time.Sleep(2 * time.Second)
		if err := conf.Update(Config{Secret: "another secret"}); err != nil {
			fmt.Printf("更新配置错误: %+v\n", err)
		}
	}()

	// 等待配置更新完成
	time.Sleep(5 * time.Second)
}
